查看原文
其他

Linux的修炼之道:从小工到专家

The following article is from 码农翻身 Author CoderCat


作者:CoderCat

原文地址:https://www.coderscat.com/how-to-learn-linux

翻译:码农翻身,已获翻译授权


前言


我依然记得在2004年我刚开始使用Ubuntu 4.04的日子,作为学生,可以在Ubuntu网站上申请免费的安装盘,几天以后,一个包含CD的包裹就到了:



从那时候开始,我在Linux平台上度过了很多编程时光,从Linux和Linux社区中学到了很多,我必须得说,通过学习Linux,我变成了一个更好的程序员。 


如果你有志于在计算机编程领域长久地发展,一定要学习Linux,但是到底学习什么?怎么学习?


这是一份给初学者从零开始学Linux的指南。


为什么要学习Linux?


也许你听说过Linux是黑客的一个很酷的工具,或者Linux对开发人员更加友好, 我认为学习Linux有三个原因:


1. Linux统治了服务器市场


大多数服务器都跑Linux, 程序员尤其是Web程序员,你的程序也会跑在Linux上,你需要在Linux上部署代码,维护服务器。


2. 学习系统级和底层编程


随着物联网的来临,更多的软件涉及到底层编程,使用C/C++编程是基本要求,这种开发通常需要精通Linux技能。 


3. 通过Linux学习计算机的基础知识


Linux是个开源项目,全世界成千上万的人在维护它,有很多关于Linux内部知识的资源和优秀书籍,对学习操作系统有极大帮助。 


Linux学习指南


对Linux的学习分为几个层次:

1. 日常使用

2. 在Linux上进行应用开发,操作和维护

3. 系统级开发

4. 内核开发


很明显,需要一层层地学习,越往下越难。


注:

对于普通程序员来说,做到第二层就差不多了。

对于想成为某个领域专家的程序员,需要达到第三层。

最后一层可能只有少数人,他们可能是自由职业者,黑客,还有不少是大公司的员工。


在开始有趣的旅程之前,先来推荐一本Linus Torvalds的自传:



日常使用


这包括:

  • 如何login , logout 

  • 如何联网

  • 如何打开命令行窗口

  • 如何使用命令行安装/卸载软件

  • 如何编辑文本文件

  • 如何创建,移动,删除文件

  • 如何查看压缩文件,提取内容。


这个阶段最难的部分就是从图形界面转向命令行。我的建议是就像学游泳那样,把自己扔到水里。不入水永远都学不会游泳。



所以,一定要在你的PC上安装一个Linux。你可以使用多系统,但是不要尝试虚拟机,因为你很容易就会放弃Linux。


到底使用哪个版本的Linux呢?现在可能有十个常见的版本,选择最主流的就好,比如Ubuntu, CentOS等。他们直接的主要区别就是GUI和软件包管理方式。



Linux上的应用开发


Linux上有各种各样的应用开发,例如Web应用,桌面GUI应用,命令行等等。 


你可能需要学习Web开发,C/C++/Python或者其他编程语言。


在Linux上做开发和在Windows上的体验不同,这里通常没有一个强大的IDE。大部分时候,你的工具链是一系列的小工具,你需要在shell中把他们“连”在一起。



你需要学习的是:

  • 在一个编辑器中写代码, 常见的编辑器是Vim/Emacs/VSCode

  • 如何编译你的程序

  • 如何从命令行启动你的程序

  • 使用调试器来寻找bug


学习一些Shell脚本编程必不可少, 至少你得学到能看懂常见Shell的水平。 


现在很多程序员更喜欢Python/Ruby, 但是仍然有很多之前开发的shell脚本需要维护。


你需要建立属于你自己的Linux开发环境。把配置文件都记录下来(比如使用Git)。如果你的开发环境搞得很好,编程的效率会有五倍提升。



《Linux Bible》 and 《Linux命令行大全》会对命令行和开发环境有个非常好的介绍。


注:在国内,自然是《鸟哥的Linux私房菜》了。


在这一阶段花费的学习时间比较长,要保持耐心。 


系统级开发


如果你的目标是开发那些“底层”的软件,比如存储程序,网络程序,那必须要进入这一层次。 


系统级编程和应用层编程大不相同,主要涉及操作系统和网络的东西。


你需要学习那些Linux内核对外提供的接口,由于历史和性能的原因,大部分都是C语言的。 


使用GDB来调试程序也是必备的技能,你可以参考《Debuging with GDB》,Valgrind 是另外一个有用的内存检查工具。



《Linux 系统编程》,《Linux系统编程手册》都是非常好的书。


网络是系统编程的一个重要编程领域,《Unix网络编程》是你最好的选择


能走到这个阶段可是不简单,只有很少程序员有使用C/C++编程的能力,现代的程序员一般使用更加高级的编程语言例如Python, Ruby ,Java。 


技术潮起潮落,但是基础总是不变,系统编程的核心知识能提升你的技能,扩展你的设计能力


内核开发


成为内核开发人员,那要求可是相当高,能走到这一步,你将是一位受人景仰的英雄人物。 在这个时候,你应该已经学过操作系统的课程了。


内核包含很多子模块:内存管理,进程调度,虚拟内存,文件系统,设备管理等。还有很多辅助开发的命令:readelf, nm, ipcs, iostat, objdump, free, chrt, pmap, uptime, top, pidstat, etc.



Robot Love写的《Linux Kernel Development》是讲述内核开发最好的入门书, 它会给你提供一个很好的内核概览。 


中文版名称是《Linux 内核设计与实现》,由陈莉君教授翻译。


还有一些内核开发的好书:

《现代操作系统》

《深入理解LINUX内核》

《深入Linux内核架构》


切记,Linux内核开发的领域太多,初学者不可能同时涉及所有领域。你的学习策略应该是:


1. 获取Linux内核的概览。 


一个好方法就是读《Linux 内核设计与实现》,或者去读一下Linux早期版本的源码,因为代码要少很多,这里有很多早期的版本:https://mirrors.edge.kernel.org/pub/linux/kernel/Historic/old-versions/

大约两周的时间就可以完成。


注:两周的时间太短了!


MIT开发的教学操作系统xv6也是一个不错的选择:
https://pdos.csail.mit.edu/6.828/2012/xv6.html


2 专注在特定子模块 


选一个你最感兴趣的模块,试图理解它的设计和细节,参与内核开发的社区,阅读相关的文档,加入Linux的mail list;查看别人的补丁,提交你的补丁。 


Linux内核社区有自己的协作风格,你需要学习这些规则。


你的第一个被接受的补丁,将会是你的一个里程碑,当你在一个领域内有了足够的知识和技能后,切换到别的领域会变的简单。


成为内核开发的大师需要花费很多年时间,快乐地编程吧!


相关链接:

Linux 内核接口:
https://en.wikipedia.org/wiki/Linux_kernel_interfaces

Valgrind :http://valgrind.org/

https://www.coderscat.com/to-be-a-programmer

Linux HowTo :
https://www.kernel.org/doc/html/v4.16/process/howto.html

Linux 邮件列表 : https://lkml.org/

xv6阅读资料:
https://pdos.csail.mit.edu/6.828/2019/reference.html




后台回复“加群”,带你进入高手如云交流群


推荐阅读:

面试字节跳动,被怼的体无完肤!

互联网公司忽悠员工的黑话!

网络通信与治理,Envoy和Nginx谁更在行?

K8s中的多容器Pod和Pod内容器间通信

中国IPv6技术发展状况白皮书(附下载)

大白话讲解技术专业用语

手把手教你在CentOS上搭建Kubernetes集群

Linux 系统结构详解

IT架构师绝对不能错过的34张史上最全技术知识图谱

2019年最新最全运维技能图谱,必看!


喜欢,就给我一个“在看”



10T 技术资源大放送!包括但不限于:云计算、虚拟化、微服务、大数据、网络、Linux、Docker、Kubernetes、Python、Go、C/C++、Shell、PPT 等。在公众号内回复「1024」,即可免费获取!!

: . Video Mini Program Like ,轻点两下取消赞 Wow ,轻点两下取消在看

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存